﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI.HtmlControls;
using System.Windows.Forms;
using Npgsql;
using Ortodoctor.Componentes;

namespace Ortodoctor.modelo
{
    class modeloProcedimentoCliente
    {
        //string connectionstring = ("Server=186.202.152.24;Port=5432;User Id=ortodoctor1;Password=DycbqDfHLI;Database=ortodoctor1;MinPoolSize=5;CommandTimeout=60;");
        string connectionstring = ("Server=localhost;Port=5432;User Id=postgres;Password=postgres;Database=ortodoctor;MinPoolSize=5;CommandTimeout=60;"); NpgsqlCommand com;
        NpgsqlConnection conn;
        NpgsqlDataAdapter da;
        //conexao con = new conexao();
        public modeloProcedimentoCliente()
        {
            conn = new NpgsqlConnection(connectionstring);
            conn.Open();
        }

        public int insert(Procedimento_Cliente p)
        {
            int dt = 0;
            try
            {
                //con.open();
                String sql = @"INSERT INTO procedimento_cliente(id_procedimento, id_cliente, valor_total, 
                         tempo_tratamento) VALUES (:p1, :p2, :p3, :p4)";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", p.IdProcedimento);
                com.Parameters.AddWithValue("p2", p.IdCliente);
                com.Parameters.AddWithValue("p3", p.ValorTotal);
                com.Parameters.AddWithValue("p4", p.TempoTratamento);
                com.ExecuteNonQuery();

                dt = Convert.ToInt32(selectMaxId().Rows[0][0]);
            }
            
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable selectMaxId()
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "select max(id_procedimento_cliente) from procedimento_cliente";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }

            return dt;
        }

        public DataTable getAll()
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();

                //bruno mudou a antiga eh essa abaixo
//                String sql = @"SELECT PROCEDIMENTO_CLIENTE.*, 
//                                  PROCEDIMENTO.NOME_PROCEDIMENTO, 
//                                  CLIENTE.NOME, 
//                                  A.VALOR AS VALOR_PARCELA, 
//                                  A.DIA_VENCIMENTO 
//                            FROM PROCEDIMENTO INNER JOIN 
//                                 PROCEDIMENTO_CLIENTE USING(ID_PROCEDIMENTO) INNER JOIN 
//CLIENTE USING(ID_CLIENTE) INNER JOIN 
//(SELECT DISTINCT VALOR, 
//    ID_PROCEDIMENTO_CLIENTE, 
//    max(extract(day from data_vencimento)) as dia_vencimento 
//FROM PARCELAS group by valor, id_procedimento_cliente) A USING(ID_PROCEDIMENTO_CLIENTE)";

                //a nova eh essa abaixo
                String sql = "select pc.*, p.nome_procedimento, c.nome, vp.valor_parcela, max(extract(day from par.data_vencimento)) as dia_vencimento "
                + "from procedimento_cliente as pc inner join cliente as c using(id_cliente) "
                + "inner join procedimento as p using (id_procedimento) inner join parcelas as par "
                + "using (id_procedimento_cliente) inner join (select avg(valor) as valor_parcela, id_procedimento_cliente "
                + "from parcelas as valor_parcela group by valor_parcela.id_procedimento_cliente) as vp using (id_procedimento_cliente) "
                + "group by pc.id_procedimento, pc.id_cliente, pc.valor_total, "
                + "pc.tempo_tratamento, pc.id_procedimento_cliente, c.nome, p.nome_procedimento, vp.valor_parcela";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getProcedimentoCliente(int id)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT PROCEDIMENTO_CLIENTE.*, PROCEDIMENTO.NOME_PROCEDIMENTO, CLIENTE.NOME FROM PROCEDIMENTO INNER JOIN PROCEDIMENTO_CLIENTE USING(ID_PROCEDIMENTO) INNER JOIN CLIENTE USING(ID_CLIENTE) " +
                             "WHERE id_procedimento_cliente=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public void update(Procedimento_Cliente p)
        {
            try
            {
                //con.open();
                String sql = "UPDATE procedimento_cliente SET valor_total=:p1 WHERE id_procedimento_cliente=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", p.ValorTotal);
                com.Parameters.AddWithValue("id", p.IdProcedimentoCliente);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public void delete(int id)
        {
            try
            {
                //con.open();
                String sql = "DELETE FROM procedimento_cliente WHERE id_procedimento_cliente=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.ExecuteNonQuery();

                sql = "DELETE FROM parcelas WHERE id_procedimento_cliente=:id";
                com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        internal DataTable getProcCliente(int p)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "select procedimento_cliente.* from procedimento_cliente where id_cliente = :id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", p);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        internal DataTable getProcClienteIndicacao(int p)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT PROCEDIMENTO_CLIENTE.* FROM PROCEDIMENTO_CLIENTE INNER JOIN PROCEDIMENTO USING(ID_PROCEDIMENTO) WHERE ID_CLIENTE = :id AND PROMOCAO = 'Sim'";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", p);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getProcClienteCarne()
        {
            DataTable dt = new DataTable();
            try
            {
                string sql = @"select pc.*, p.nome_procedimento, c.nome, vp.valor_parcela, max(extract(day from par.data_vencimento)) as dia_vencimento 
                                from procedimento_cliente as pc inner join cliente as c using(id_cliente) 
                                inner join procedimento as p using (id_procedimento) inner join parcelas as par 
                                using (id_procedimento_cliente) inner join (select avg(valor) as valor_parcela, id_procedimento_cliente 
                                from parcelas as valor_parcela group by valor_parcela.id_procedimento_cliente) as vp using (id_procedimento_cliente) 
                                where carne = false 
                                group by pc.id_procedimento, pc.id_cliente, pc.valor_total, 
                                pc.tempo_tratamento, pc.id_procedimento_cliente, c.nome, p.nome_procedimento, vp.valor_parcela";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public void updateCarne(int id)
        {
            try
            {
                //con.open();
                String sql = "UPDATE procedimento_cliente SET carne=true WHERE id_procedimento_cliente=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }
    }
}
